#include "board_uart.h"
#include "gd32f4xx.h"
#include "gd32f4xx_gpio.h"


static BOARD_COM_CONFIG_T com_config[] = {
        // 对外连接的串口
        {USART0, RCU_GPIOA, RCU_USART0, GPIOA, GPIO_PIN_9, GPIO_PIN_10, GPIO_AF_7, 115200, USART0_IRQn},

//        // 对外连接的串口2
        {USART1, RCU_GPIOD, RCU_USART1, GPIOD, GPIO_PIN_5, GPIO_PIN_6,  GPIO_AF_7, 115200, USART1_IRQn},
};

void board_uart_init(void) {
    int i;
    BOARD_COM_CONFIG_T *config;

    for (i = 0; i < sizeof(com_config) / sizeof(BOARD_COM_CONFIG_T); i++) {
        config = &com_config[i];
        nvic_irq_enable(config->irq, 0U, i);

        /* enable GPIO clock */
        rcu_periph_clock_enable(config->gpio_clk);

        /* enable USART clock */
        rcu_periph_clock_enable(config->usart_clk);

        /* connect port to USARTx_Tx */
        gpio_af_set(config->gpio_port, config->af, config->tx_pin);

        /* connect port to USARTx_Rx */
        gpio_af_set(config->gpio_port, config->af, config->rx_pin);

        /* configure USART Tx as alternate function push-pull */
        gpio_mode_set(config->gpio_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, config->tx_pin);
        gpio_output_options_set(config->gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, config->tx_pin);

        /* configure USART Rx as alternate function push-pull */
        gpio_mode_set(config->gpio_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, config->rx_pin);
        gpio_output_options_set(config->gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, config->rx_pin);

        /* USART configure */
        usart_deinit(config->com);
        usart_baudrate_set(config->com, config->baudrate);
        usart_receive_config(config->com, USART_RECEIVE_ENABLE);
        usart_transmit_config(config->com, USART_TRANSMIT_ENABLE);
        usart_enable(config->com);
        if (USART1 == config->com || USART2 == config->com) {
            usart_interrupt_enable(config->com, USART_INTEN_IDLEIE);
        } else {
            usart_interrupt_enable(config->com, USART_INTEN_RBNEIE);
        }
    }
}

